/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.talentos.facade;

import br.uniceub.fsw.arquitetura.persistencia.transacao.Transacao;
import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.talentos.dao.PerfilDAO;
import br.uniceub.fsw.talentos.vo.PerfilVO;
import br.uniceub.fsw.talentos.bo.PerfilBO;
import br.uniceub.fsw.talentos.dao.HabilidadeDAO;
import br.uniceub.fsw.talentos.dao.HabilidadePerfilDAO;
import br.uniceub.fsw.talentos.dao.TipoHabilidadeDAO;
import br.uniceub.fsw.talentos.vo.HabilidadePerfilVO;
import br.uniceub.fsw.talentos.vo.HabilidadeVO;
import br.uniceub.fsw.talentos.vo.TipoHabilidadeVO;
import br.uniceub.fsw.util.TabelaHtml;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Facade da entidade Perfil.
 * 
 * @author Bruno Schifer Bernardi
 */
public class PerfilFacade {
    /**
     * Mensagem de retorno do sistema.
     */
    private String message;

    /**
     * Value object do perfil.
     */
    private PerfilVO perfil;
    
    /**
     * Objeto de acesso aos dados de perfil.
     */
    private PerfilDAO perfilDao;
    
    /**
     * Objeto da camada de negócio de perfil.
     */
    private PerfilBO perfilBo;
    
    /**
     * Value object do tipo de habilidade.
     */
    private TipoHabilidadeVO tipoHabilidade;
    
    /**
     * Construtor da classe.
     */
    public PerfilFacade() {
        this.perfilDao = new PerfilDAO();
        this.perfilBo = new PerfilBO();
    }
    
    /**
     * Getter da mensagem de retorno.
     * 
     * @return Mensagem de retorno.
     */
    public String getMessage() {
        String retorno = null;
        if(this.message == null || this.message.equals("")) {
            retorno = "&nbsp";
        } else {
            retorno = this.message;
        }
        return retorno;
    }

    /**
     * Setter da mensagem de retorno.
     * 
     * @param message Mensagem de retorno.
     */
    public void setMessage(String message) {
        this.message = message;
    }
    
    /**
     * Responsável por executar a operação selecionada pelo usuário.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void operacao(HttpServletRequest req, HttpServletResponse resp) {
        String oper = req.getParameter("operacao");

        if(oper != null)
        {
            if (oper.equals("consultar")) {
                this.consultar(req, resp);
            }
            if (oper.equals("incluir")) {
                this.incluir(req, resp);
            }
            if (oper.equals("alterar")) {
                this.alterar(req, resp);
            }
            if (oper.equals("excluir")) {
                this.excluir(req, resp);
            }
            if (oper.equals("confirmar")) {
                this.confirmar(req, resp);
            }
            if (oper.equals("recarregar")) {
                this.recarregar(req, resp);
            }
            if (oper.equals("limpar")) {
                this.limpar(req, resp);
            }
            if (oper.equals("excluirItem")) {
                this.excluirItem(req, resp);
            }
            if (oper.equals("incluirItem")) {
                this.incluirItem(req, resp);
            }
        }
    }

    /**
     * Retorna o perfil.
     * 
     * @return Objeto perfil.
     */
    public PerfilVO getPerfil() {
        return this.perfil;
    }
    
    /**
     * Seta o perfil.
     * 
     * @param perfil Objeto perfil.
     */
    public void setPerfil(PerfilVO perfil) {
        this.perfil = perfil;
    }
    
    /**
     * Retorna o tipoHabilidade.
     * 
     * @return Objeto tipoHabilidade.
     */
    public TipoHabilidadeVO getTipoHabilidade() {
        return this.tipoHabilidade;
    }
    
    /**
     * Seta o tipoHabilidade.
     * 
     * @param tipoHabilidade Objeto tipoHabilidade.
     */
    public void setTipoHabilidade(TipoHabilidadeVO tipoHabilidade) {
        this.tipoHabilidade = tipoHabilidade;
    }
    
    /**
     * Consultar um perfil.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void consultar(HttpServletRequest req, HttpServletResponse resp) {
        String idPerfilTmp = req.getParameter("idPerfil");
        
        Integer idPerfil = null;
        
        if(idPerfilTmp == null || idPerfilTmp.equals("")) {
            return;
        } else {
            idPerfil = Integer.parseInt(idPerfilTmp);
        }
        
        this.perfil = perfilDao.consultarPorId(idPerfil);
    }

    /**
     * Incluir um perfil.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void incluir(HttpServletRequest req, HttpServletResponse resp) {
        String noPerfil = req.getParameter("noPerfil");

        perfil = new PerfilVO();
        perfil.setNoPerfil(noPerfil);
        
        String mensagem = null;
        
        // Validações da BO
        try {
            perfilBo.validarVOUnico(perfil);
        } catch(NegocioException ex) {
            mensagem = ex.getMessage();
        }
        
        if(mensagem == null || mensagem.equals("")) {
            try {
                Transacao.iniciar();

                perfilDao.inserir(perfil);

                Transacao.efetivar();

                mensagem = "Perfil incluído com sucesso.";
            } catch (Exception ex) {
                Transacao.desfazer();

                mensagem = "Problema na inclusão do perfil: " + ex.getMessage();
                
                perfil = null;
            }
        } else {
            perfil = null;
        }
        
        this.message = mensagem;
    }

    /**
     * Alterar um perfil.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void alterar(HttpServletRequest req, HttpServletResponse resp) {
        String idPerfil = req.getParameter("idPerfil");
        String noPerfil = req.getParameter("noPerfil");

        perfil = new PerfilVO();
        perfil.setIdPerfil(Integer.parseInt(idPerfil));
        perfil.setNoPerfil(noPerfil);
        
        String mensagem = null;
        
        // Validações da BO
        try {
            perfilBo.validarVOUnico(perfil);
        } catch(NegocioException ex) {
            mensagem = ex.getMessage();
        }
        
        if(mensagem == null || mensagem.equals("")) {
            try {
                Transacao.iniciar();

                perfilDao.alterar(perfil);

                Transacao.efetivar();

                mensagem = "Perfil alterado com sucesso.";
            } catch (Exception ex) {
                Transacao.desfazer();

                mensagem = "Problema na alteração do perfil: " + ex.getMessage();
            }
        } else {
            perfil = null;
        }
        
        this.message = mensagem;
    }

    /**
     * Excluir um perfil.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void excluir(HttpServletRequest req, HttpServletResponse resp) {
        String idPerfil = req.getParameter("idPerfil");

        perfil = new PerfilVO();
        perfil.setIdPerfil(Integer.parseInt(idPerfil));
        
        String mensagem = null;
        
        try {
            Transacao.iniciar();
            
            HabilidadePerfilDAO habilidadePerfilDao = new HabilidadePerfilDAO();
            
            HabilidadePerfilVO exemplo = new HabilidadePerfilVO();
            
            exemplo.setCdPerfil(perfil.getIdPerfil());
            
            List<HabilidadePerfilVO> habilidadesPerfil = habilidadePerfilDao.consultarPorExemplo(exemplo);

            for(HabilidadePerfilVO habilidadePerfil : habilidadesPerfil) {
                habilidadePerfilDao.excluir(habilidadePerfil);
            }
            
            perfilDao.excluir(perfil);
            
            Transacao.efetivar();
            
            mensagem = "Perfil excluído com sucesso.";
        } catch (Exception ex) {
            Transacao.desfazer();
            
            mensagem = "Problema na exclusão do perfil: " + ex.getMessage();
        }
        
        this.perfil = null;
        
        this.message = mensagem;
    }
    
    /**
     * Confirmar a exclusão de perfil.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void confirmar(HttpServletRequest req, HttpServletResponse resp) {
        String idPerfil = req.getParameter("idPerfil");
        String noPerfil = req.getParameter("noPerfil");

        perfil = new PerfilVO();
        perfil.setIdPerfil(Integer.parseInt(idPerfil));
        perfil.setNoPerfil(noPerfil);
    }

    /**
     * Recarregar a página após alguma ação de seleção de combo.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void recarregar(HttpServletRequest req, HttpServletResponse resp) {
        String idPerfil = req.getParameter("idPerfil");
        String idTipoHabilidade = req.getParameter("idTipoHabilidade");

        if(idPerfil != null && !idPerfil.isEmpty()) {
            perfil = perfilDao.consultarPorId(idPerfil);
        }

        TipoHabilidadeDAO tipoHabilidadeDao = new TipoHabilidadeDAO();
        
        if(idTipoHabilidade != null && !idTipoHabilidade.isEmpty()) {
            tipoHabilidade = tipoHabilidadeDao.consultarPorId(idTipoHabilidade);
        }
    }

    /**
     * Limpar objetos.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void limpar(HttpServletRequest req, HttpServletResponse resp) {
        perfil = null;
        tipoHabilidade = null;
    }

    /**
     * Exclui uma habilidade da lista.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void excluirItem(HttpServletRequest req, HttpServletResponse resp) {
        String idHabilidade = req.getParameter("idHabilidadeExclusao");
        String idPerfil = req.getParameter("idPerfil");
        
        String mensagem = null;

        try {
            Transacao.iniciar();
            
            if(idPerfil != null && !idPerfil.isEmpty()) {
                perfil = perfilDao.consultarPorId(idPerfil);
            }

            HabilidadePerfilDAO habilidadePerfilDao = new HabilidadePerfilDAO();

            HabilidadePerfilVO exemplo = new HabilidadePerfilVO();

            exemplo.setCdHabilidade(idHabilidade==null||idHabilidade.isEmpty()?null:Integer.parseInt(idHabilidade));
            exemplo.setCdPerfil(perfil.getIdPerfil());

            List<HabilidadePerfilVO> habilidadePerfil = habilidadePerfilDao.consultarPorExemplo(exemplo);

            habilidadePerfilDao.excluir(habilidadePerfil.get(0));
            
            Transacao.efetivar();
            
            mensagem = "Habilidade excluída com sucesso.";
        } catch (Exception ex) {
            Transacao.desfazer();
            
            mensagem = "Problema na exclusão da habilidade: " + ex.getMessage();
        }
        
        this.message = mensagem;
    }

    /**
     * Inclui uma habilidade na lista.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void incluirItem(HttpServletRequest req, HttpServletResponse resp) {
        String idHabilidade = req.getParameter("idHabilidade");
        String idPerfil = req.getParameter("idPerfil");
        
        String mensagem = null;

        try {
            Transacao.iniciar();
            
            if(idPerfil != null && !idPerfil.isEmpty()) {
                perfil = perfilDao.consultarPorId(idPerfil);
            }

            HabilidadePerfilDAO habilidadePerfilDao = new HabilidadePerfilDAO();

            HabilidadePerfilVO habilidadePerfil = new HabilidadePerfilVO();

            habilidadePerfil.setCdHabilidade(idHabilidade==null||idHabilidade.isEmpty()?null:Integer.parseInt(idHabilidade));
            habilidadePerfil.setCdPerfil(perfil.getIdPerfil());
        
            habilidadePerfilDao.inserir(habilidadePerfil);
            
            Transacao.efetivar();
            
            mensagem = "Habilidade incluída com sucesso.";
        } catch (Exception ex) {
            Transacao.desfazer();
            
            mensagem = "Problema na inclusão da habilidade: " + ex.getMessage();
        }
        
        this.message = mensagem;
    }

    /**
     * Retorna uma lista de perfils a partir de parâmetros da tela
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     * @return objeto tabela com as informações necessárias
     */
    public TabelaHtml consultarPerfis(HttpServletRequest req, HttpServletResponse resp) {
        String nome = req.getParameter("noPerfil");
        
        if(nome != null && !nome.equals("")) {
            TabelaHtml tabela = new TabelaHtml();
            
            tabela.setCampoRetorno("idPerfil");
            
            tabela.adicionarTitulo("Id");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("Integer");
            tabela.adicionarStatus(false);

            tabela.adicionarTitulo("Nome");
            tabela.adicionarTamanho(80);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(true);
            
            tabela.gravarCampos();
            
            PerfilVO exemplo = new PerfilVO();
            
            exemplo.setNoPerfil(nome);
            
            // Lista de perfils
            List<PerfilVO> perfils = perfilDao.consultarPorExemplo(exemplo);
            
            // Adiciona os valores de cada perfil nas listas de ids e nomes
            for(int i = 0; i < perfils.size(); i++) {
                tabela.adicionarRegistro(converterVoParaString(perfils.get(i)));
            }

            return tabela;
        }
        
        return null;
    }

    /**
     * Retorna uma lista de habilidades a partir de parâmetros da tela
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     * @return objeto tabela com as informações necessárias
     */
    public TabelaHtml consultarHabilidades(HttpServletRequest req, HttpServletResponse resp) {
        if(perfil != null) {
            TabelaHtml tabela = new TabelaHtml();
            
            tabela.setCampoRetorno("idHabilidadeExclusao");
            
            tabela.adicionarTitulo("Id");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("Integer");
            tabela.adicionarStatus(false);

            tabela.adicionarTitulo("Nome");
            tabela.adicionarTamanho(80);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(true);
            
            tabela.gravarCampos();
            
            HabilidadePerfilVO exemplo = new HabilidadePerfilVO();
            
            exemplo.setCdPerfil(perfil.getIdPerfil());
            
            HabilidadePerfilDAO habilidadePerfilDao = new HabilidadePerfilDAO();
            
            // Lista de perfils
            List<HabilidadePerfilVO> habilidadesPerfil = habilidadePerfilDao.consultarPorExemplo(exemplo);
            
            // Adiciona os valores de cada perfil nas listas de ids e nomes
            for(int i = 0; i < habilidadesPerfil.size(); i++) {
                HabilidadeVO habilidade = habilidadesPerfil.get(i).getHabilidade();
                
                tabela.adicionarRegistro(converterHabilidadeVoParaString(habilidade));
            }

            return tabela;
        }
        
        return null;
    }

    /**
     * Retorna uma lista de tipos de habilidade ordenada por nome
     * 
     * @return lista com as informações necessárias
     */
    public List<List> consultarTiposHabilidade() {
        List<List> lista = new ArrayList<List>();

        TipoHabilidadeDAO tipoHabilidadeDao = new TipoHabilidadeDAO();
        
        List<TipoHabilidadeVO> tipos = tipoHabilidadeDao.consultarTiposOrdenadoPorNome();
        
        for(int i = 0; i < tipos.size(); i++) {
            List<String> registro = new ArrayList<String>();
            registro.add(tipos.get(i).getIdTipoHabilidade().toString());
            registro.add(tipos.get(i).getNoTipoHabilidade());
            
            lista.add(registro);
        }
        
        return lista;
    }
    
    /**
     * Retorna uma lista de habilidades ordenada por nome
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     * @return lista com as informações necessárias
     */
    public List<List> consultarHabilidadesPorTipo(HttpServletRequest req, HttpServletResponse resp) {
        String idTipoHabilidade_tmp = req.getParameter("idTipoHabilidade");
        
        Integer idTipoHabilidade = (idTipoHabilidade_tmp == null || idTipoHabilidade_tmp.equals(""))?null:Integer.parseInt(idTipoHabilidade_tmp);
        
        List<List> lista = new ArrayList<List>();

        HabilidadeDAO habilidadeDao = new HabilidadeDAO();
        
        List<HabilidadeVO> habilidades = habilidadeDao.consultarHabilidadesPorTipoOrdenadoPorNome(idTipoHabilidade);
        
        for(int i = 0; i < habilidades.size(); i++) {
            List<String> registro = new ArrayList<String>();
            registro.add(habilidades.get(i).getIdHabilidade().toString());
            registro.add(habilidades.get(i).getNoHabilidade());
            
            lista.add(registro);
        }
        
        return lista;
    }
    
    /**
     * Transforma os campos de um VO em uma lista de Strings
     * 
     * @return lista de strings com os valores em ordem
     */
    public List<String> converterVoParaString(PerfilVO perfil) {
        List<String> valores = new ArrayList<String>();
        
        valores.add(perfil.getIdPerfil().toString());
        valores.add(perfil.getNoPerfil());
        
        return valores;
    }
    
    /**
     * Transforma os campos de um VO em uma lista de Strings
     * 
     * @return lista de strings com os valores em ordem
     */
    public List<String> converterHabilidadeVoParaString(HabilidadeVO habilidade) {
        List<String> valores = new ArrayList<String>();
        
        valores.add(habilidade.getIdHabilidade().toString());
        valores.add(habilidade.getNoHabilidade());
        
        return valores;
    }
}
